package com.atguigu.gmall.order.service;

import com.atguigu.gmall.enums.model.ProcessStatus;
import com.atguigu.gmall.order.model.OrderInfo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.Map;

/**
 * 订单表 订单表 业务接口类
 * @author atguigu
 * @since 2023-03-10
 */
public interface OrderInfoService extends IService<OrderInfo> {

    /**
     * 渲染用户订单确认页面相关参数
     *
     * @param userId 用户ID
     * @return
     */
    Map<String, Object> tradeDatas(String userId);

    /**
     * 保存订单,响应保存后订单ID
     *
     * @param orderInfo
     * @param tradeNo
     * @return
     */
    Long submitOrder(OrderInfo orderInfo, String tradeNo);


    /**
     * 生成流水号
     * @param userId
     * @return
     */
    String generateTradeNo(String userId);


    /**
     * 验证流水号是否一致
     * @param userId
     * @param tradeNo
     * @return
     */
    Boolean checkTradeNo(String userId, String tradeNo);


    /**
     * 删除业务流水号
     * @param userId
     */
    void deleteTradeNo(String userId);



    /**
     * 验证库存
     * @param skuId
     * @param skuNum
     * @return
     */
    boolean checkStock(Long skuId, Integer skuNum);

    /**
     * 查询当前登录用户订单列表(包括订单明细)
     *
     * @param iPage
     * @param userId
     * @param status
     * @return
     */
    IPage<OrderInfo> getOrderList(IPage<OrderInfo> iPage, String userId, String status);




    /**
     * 关闭订单
     * @param orderId
     */
    void execExpiredOrder(Long orderId);

    /**
     * 按照指定状态修改订单
     * @param orderId
     * @param processStatus
     */
    void updateOrderStatus(Long orderId, ProcessStatus processStatus);

    /**
     * 根据订单编号查询订单信息
     * @param outTradeNo
     * @return
     */
    OrderInfo getOrderInfoByOutradeNo(String outTradeNo);

    /**
     * 构建扣减库存消息,通知库存系统库存锁定/扣减
     * @param outTradeNo
     */
    void sendDeductStockMsg(String outTradeNo);

    /**
     * 提供给库存系统调用订单拆单接口
     *
     * @param orderId    订单ID
     * @param wareSkuMap [{"wareId":"1","skuIds":["28","29"]},{"wareId":"2","skuIds":["24"]}]
     * @return
     */
    String orderSplit(String orderId, String wareSkuMap);


    /**
     * 根据订单ID查询订单以及订单明细
     * @param orderId
     * @return
     */
    OrderInfo getOrderInfo(Long orderId);

    /**
     * 保存秒杀订单
     * @param orderInfo
     * @return
     */
    Long submitSeckillOrder(OrderInfo orderInfo);
}
